package zhang_wei_le;
/**
 * @CLASSDESCRIPER:
队列的Queue类有3个属性，它的头节点,尾节点和它的元素长度，
node内部类，代表每个队列的属性值，它保存有下一个节点的地址，当前元素值。

入列:
首先判断最后一个结点是否为空，如果最后一个结点为空的话，就把当前结点赋值给last，然后让头结点的下一个结点指向last。
如果当前队列不是空队列的话，那么就新建一个结点来存最后一个结点的地址，然后让新建的这个结点的地址指向当前创建的这个结点，
让当前创建的这个结点为队列的尾结点。

出列:
如果当前队列是空队列，那么我们就没有元素出列，这时直接返回null，
如果不是空队列的话，就新建一个结点用来保存头结点的下一个结点地址，然后head=head.next.next；
删除这个结点的地址，再让队列长度减一，最后再用isEmpty方法判断这个队列是不是空队列。
如果是空队列的话，那么让这个队列的last元素值为空。最后返回刚刚保存的head.next的元素值

 *  @AUTHOR:zhangweile
 * @PHONE:1993602749
 * @EMIAL:1993602749@qq.COM
 * @DATE: 2021/1/23
 * @PARAMDESCRIPER:
 * @OUTPARAMDESCRIPER:
 */
public class ZHANG_WEI_LE_23_Q2 {
    //定义首结点
    private Node head;
    //定义记录当前队列的元素个数
    private int n;
    //最后一个结点
    private Node last;
    public ZHANG_WEI_LE_23_Q2 () {
        //头节点的初始化为空
        head = new Node(null, null);
        last = null;
        n = 0;
    }
    // 判断队列是否为空   (如果为空就会返回0)
    public boolean isEmpty() {
        return n == 0;
    }
    // 获取队列中元素的个数
    public int size()
    {
        return n;
    }
    //从队列中拿出一个元素 (出队  如果为空就返回null)
    public String dequeue() {
        if (isEmpty()) {
            return null;
        }
        // 如果不是空就能出列 输出值
        // 获取当前的第一个元素
        Node oldFirst = head.next;//保存第一个节点
        // 让head结点指向下一个结点（对应图中的2元素）
        head.next = head.next.next;//删除第一个节点(出列)
        // 个数-1
        n--;

        if (isEmpty()) {
            last = null;
        }
        return oldFirst.item;
    }
    //往队列中插入一个元素
    public void enqueue(String t) {
        // 判断last是否为null
        if (last == null) {
            // last为空，要插入的元素就是last
            last = new Node(t, null);
            // 让首结点指向last
            head.next = last;
        } else {
            // 不是第一个元素
            // 取出旧结点（last）
            Node oldLast = last;
            // 创建新的结点给last
            last = new Node(t, null);
            // 让旧的last元素指向新的结点
            oldLast.next = last;
        }
        // 个数+1
        n++;
    }
    private class Node {
        public String item;
        public Node next;
        public Node(String item, Node next) {
            this.item = item;
            this.next = next;
        }
    }
    public static void main(String[] args) {
        ZHANG_WEI_LE_23_Q2  queue = new ZHANG_WEI_LE_23_Q2 ();
        queue.enqueue("z");
        queue.enqueue("w");
        queue.enqueue("l");
        queue.enqueue("l");
        System.out.println(queue.size());
        System.out.println(queue.dequeue());//先进先出。(输出z)
        System.out.println(queue.size());
        System.out.println(queue.isEmpty());
        queue.dequeue();
        queue.dequeue();
        queue.dequeue();//全部出列
        System.out.println(queue.isEmpty());
        System.out.println(queue.size());//0
    }
}

